package com.shujia.mllib

import org.apache.spark.ml.classification.{LogisticRegression, LogisticRegressionModel}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}

object Demo2Person {
  def main(args: Array[String]): Unit = {


    val spark: SparkSession = SparkSession.builder()
      .appName("person")
      .master("local")
      .config("spark.sql.shuffle.partitions", "2")
      .getOrCreate()

    import spark.implicits._
    import org.apache.spark.sql.functions._

    //1  读取被处理过的SVM格式的数据
    val data: DataFrame = spark
      .read
      .format("libsvm")
      .load("spark/data/人体指标.txt")


    //2 将数据切分成训练集和测试集
    //训练集0.7  测试集0.3
    val splitDS: Array[Dataset[Row]] = data.randomSplit(Array(0.7, 0.3))
    //训练集
    val tran: Dataset[Row] = splitDS(0)
    //测试集
    val text: Dataset[Row] = splitDS(1)


    //3 选择算法，这里是一个二分类问题，可以选择逻辑回归算法

    //构建算法
    val regression = new LogisticRegression()

    //设置是否有截距
    regression.setFitIntercept(true)

    //最大迭代次数
    regression.setMaxIter(100)


    //4、将训练集带入算法训练模型
    val model: LogisticRegressionModel = regression.fit(tran)


    //5、模型评估
    val testDF: DataFrame = model.transform(text)

    // 计算准确率
    val p: DataFrame = testDF.select(sum(when($"label" === $"prediction", "1.0").otherwise("0.0")) / count($"label") as "p")

    p.show()

    //6、如果模型准确率还可以，将模型保存起来
    //保存到hdfs
    model.save("spark/data/model")


    //模型使用
    //加载模型
//    val model1: LogisticRegressionModel = LogisticRegressionModel.load("spark/data/model")


  }

}
